﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Serialization;
using System.Security;
using System.Text.RegularExpressions;


namespace ITA
{
    /// <summary>
    /// Adathozzáférési interface implementálása és file alapú tárolást megvalósító osztály.
    /// </summary>
    public class XmlMentes :IAdatkezeles
    {
        #region
        /// <summary>
        /// Betölti az adott file azonosítóhoz tartozó megjegyzés(eke)t az xml-ből.
        /// </summary>
        /// <param name="fajlazonosito">A fájl útvonala, ez alapján 
        /// azonosítjuk a megjegyzéseket</param>
        /// <returns>A file útvonalhoz tartozó megjegyzés(eke)t vagy egy üres objektum, ha
        /// még nincs(enek) eltárolt megjegyzés(ek)</returns>
        /// <exception cref="ITA.ItaAdatEleresException">I/O hiba esetén</exception>
        public Megjegyzes Betoltes(string fajlazonosito)
        {

            XmlSerializer xml = new XmlSerializer(typeof(SerializableDictionary<string, Megjegyzes>));
            try
            {
                if (string.IsNullOrWhiteSpace(fajlazonosito))
                {
                    throw new ItaAdatEleresException("Nem megfelelő illetve üres a fileazonosító");
                }
                if (File.Exists("Mentes.xml") == false)
                {
                    return new Megjegyzes(){Utvonal = fajlazonosito};
                }
                if (!(fajlazonosito.EndsWith(".jpg")) && !(fajlazonosito.EndsWith(".jpe")) && !(fajlazonosito.EndsWith(".png")) && !(fajlazonosito.EndsWith(".gif"))
                    && !(fajlazonosito.EndsWith(".ico")) && !(fajlazonosito.EndsWith(".bmp")))
                {
                    throw new ItaAdatEleresException("Dobj be egy 100-ast, és próbáld újra!");
                }
                using (StreamReader reader = new StreamReader("Mentes.xml"))
                {

                    SerializableDictionary<string, Megjegyzes> mentett = (SerializableDictionary<string, Megjegyzes>)xml.Deserialize(reader);
                    Megjegyzes result = null;
                    if (mentett.ContainsKey(fajlazonosito))
                    {
                        result = mentett[fajlazonosito];
                    }
                    else
                    {
                        result = new Megjegyzes() {Utvonal  = fajlazonosito};
                    }
                    
                    return result;
                }
            }
            catch (IOException e)
            {
                throw new ItaAdatEleresException("File olvasási hiba történt.", e);
            }
            catch (InvalidOperationException e)
            {
                throw new ItaAdatEleresException("A metódushívás nem megfelelő az objektum aktuális státuszához", e);
            }
        }
        #endregion

        #region
        /// <summary>
        /// Elmenti/eltárolja az adott filehoz tartozó megjegyzés(eke)t egy xml file-ba.
        /// </summary>
        /// <param name="megjegyzes">Egy adott filehoz tartozó megjegyzés(ek).</param>
        /// <exception cref="ITA.ItaAdatEleresException">I/O hiba esetén </exception>
        public void Mentes(Megjegyzes megjegyzes, string utvonal)
        {            
            XmlSerializer xml = new XmlSerializer(typeof(SerializableDictionary<string, Megjegyzes>));
            try
            {
                if (megjegyzes == null || megjegyzes.Utvonal == null)
                {
                    throw new ItaAdatEleresException("A kép útvonala nem megfelelő/ vagy egyáltalán nincs megjegyzés!");
                }
                SerializableDictionary<string, Megjegyzes> megjegyzesekDictionary;
                if (File.Exists("Mentes.xml"))
                {
                    using (StreamReader reader = new StreamReader("Mentes.xml"))
                    {
                        megjegyzesekDictionary = (SerializableDictionary<string, Megjegyzes>)xml.Deserialize(reader);
                    }
                }
                else
                {
                    megjegyzesekDictionary = new SerializableDictionary<string, Megjegyzes>();
                }
                if (megjegyzesekDictionary.ContainsKey(megjegyzes.Utvonal))
                {
                    megjegyzesekDictionary[megjegyzes.Utvonal].SzovegLista.Add(megjegyzes.SzovegLista.First());
                }
                else
                {
                    megjegyzesekDictionary.Add(megjegyzes.Utvonal, megjegyzes);
                }
                using (StreamWriter writer = new StreamWriter("Mentes.xml"))
                {
                    xml.Serialize(writer, megjegyzesekDictionary);
                }
            }
            catch (UnauthorizedAccessException e)
            {
                throw new ItaAdatEleresException("Nem rendelkezik jogosultsággal", e);
            }
            catch (PathTooLongException e)
            {
                throw new ItaAdatEleresException("Az útvonal túl hosszú.", e);
            }
            catch (IOException e)
            {
                throw new ItaAdatEleresException("File olvasási hiba történt.", e);
            }
            catch (SecurityException e)
            { 
                throw new ItaAdatEleresException("Sajnos nem rendelkezik jogosultsággal a változó használatához", e);
            }
            catch (InvalidOperationException e)
            {
                throw new ItaAdatEleresException("A metódushívás nem megfelelő az objektum aktuális státuszához", e);
            }


        }
        #endregion

        #region
        public void Kereses(string keresettKep)
        { 
              XmlSerializer xml = new XmlSerializer(typeof(SerializableDictionary<string, Megjegyzes>));

              if (File.Exists("Mentes.xml") == false)
                {
                    throw new ItaAdatEleresException("nem találhatóó az adatbázis xml fájl");
                }
                using (StreamReader reader = new StreamReader("Mentes.xml"))
                {

                    SerializableDictionary<string, Megjegyzes> mentett = (SerializableDictionary<string, Megjegyzes>)xml.Deserialize(reader);
                    //TODO átnevezni a resultot
                    Megjegyzes result = new Megjegyzes();
                   

                   
                    foreach (var item in mentett)
                    {                      
                        result.SzovegLista = item.Value.SzovegLista;
                       
                        foreach (var item2 in result.SzovegLista)
                        {
                            if(item2.Hosszu.Contains(keresettKep) || item2.Rovid.Contains(keresettKep))
                            {
                                //seged = result.Utvonal;
                                Betoltes(result.Utvonal);
                            }
                        
                        }

                    }

                }
            }
        #endregion

        #region
        public void Torles(Szoveg torlendo, string fajlazonosito)
        {
            XmlSerializer xml = new XmlSerializer(typeof(SerializableDictionary<string, Megjegyzes>));
            try
            {
                if (string.IsNullOrWhiteSpace(fajlazonosito))
                {
                    throw new ItaAdatEleresException("Nem megfelelő illetve üres a fileazonosító");
                }
                SerializableDictionary<string, Megjegyzes> mentett;
                if (File.Exists("Mentes.xml") == false)
                {
                    throw new ItaAdatEleresException("Nem található az adatbázis.");
                }
                using (StreamReader reader = new StreamReader("Mentes.xml"))
                {

                    mentett = (SerializableDictionary<string, Megjegyzes>)xml.Deserialize(reader);
                    if (mentett.ContainsKey(fajlazonosito))
                    {
                        mentett[fajlazonosito].SzovegLista.Remove(torlendo);
                    }
                }

                using (StreamWriter writer = new StreamWriter("Mentes.xml"))
                {
                    xml.Serialize(writer, mentett);
                }

            }
            catch (IOException e)
            {
                throw new ItaAdatEleresException("File olvasási hiba történt.", e);
            }
            catch (InvalidOperationException e)
            {
                throw new ItaAdatEleresException("A metódushívás nem megfelelő az objektum aktuális státuszához", e);
            }
        }
        #endregion

        #region
        public void Modositas(int sorszam, Szoveg ujSzoveg, string fajlazonosito)
        {
            XmlSerializer xml = new XmlSerializer(typeof(SerializableDictionary<string, Megjegyzes>));
            try
            {
                if (string.IsNullOrWhiteSpace(fajlazonosito))
                {
                    throw new ItaAdatEleresException("Nem megfelelő illetve üres a fileazonosító");
                }
                SerializableDictionary<string, Megjegyzes> mentett;
                if (File.Exists("Mentes.xml") == false)
                {
                    throw new ItaAdatEleresException("Nem található az adatbázis.");
                }
                using (StreamReader reader = new StreamReader("Mentes.xml"))
                {

                    mentett = (SerializableDictionary<string, Megjegyzes>)xml.Deserialize(reader);
                    if (mentett.ContainsKey(fajlazonosito))
                    {
                        mentett[fajlazonosito].SzovegLista[sorszam] = ujSzoveg;
                    }
                }

                using (StreamWriter writer = new StreamWriter("Mentes.xml"))
                {
                    xml.Serialize(writer, mentett);
                }

            }
            catch (IOException e)
            {
                throw new ItaAdatEleresException("File olvasási hiba történt.", e);
            }
            catch (InvalidOperationException e)
            {
                throw new ItaAdatEleresException("A metódushívás nem megfelelő az objektum aktuális státuszához", e);
            }
        }
        #endregion
    }





}
